package com.qf.controller;


import com.github.pagehelper.PageInfo;
import com.qf.constant.SsmModelConstant;
import com.qf.entity.Item;
import com.qf.enums.ErrorMsgEnums;
import com.qf.exception.SsmModelException;
import com.qf.service.ItemService;
import com.qf.vo.ResultVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import java.io.File;
import java.io.IOException;
import java.util.UUID;

@Controller
@RequestMapping("/item")
@Slf4j
public class ItemController {

    @Autowired
    private ItemService itemService;

    //分页展示商品
    @GetMapping("/list")
    public String list(@RequestParam(defaultValue = "1") Integer page,
                       @RequestParam(defaultValue = "3") Integer size,
                       @RequestParam(defaultValue = "") String name,
                       Model model){


        PageInfo<Item> pageInfo = itemService.findPage(name,page, size);
        model.addAttribute("pageInfo",pageInfo);
        model.addAttribute("oldname",name);
        return "item/item_list";
    }

    //跳转添加商品页面
    @GetMapping("/add-ui")
    public String insertUI(){
        return "item/item_add";
    }

    //添加商品信息
    @PostMapping("/add")
    @ResponseBody
    public ResultVO add(@Valid Item item, BindingResult bindingResult,
                        MultipartFile picFile,
                        HttpServletRequest request) throws IOException {

        if (bindingResult.hasErrors()){
            String msg = bindingResult.getFieldError().getDefaultMessage();
            log.info("【接收参数】 添加商品信息参数不匹配！ item={} msg={}",item,msg);
            throw new SsmModelException(ErrorMsgEnums.PACKAGE_PARAMETERS_ERROR.getCode(),msg);
        }
//        上传文件
        if (picFile==null||picFile.getSize()==0){
            log.info("【上传文件】 上传文件不能为空！ picFile={} ",picFile);
            throw new SsmModelException(ErrorMsgEnums.UPLOAD_SIZE_ERROR.getCode(),"上传文件不能为空！");
        }
//        5.1 大小判断.
        if (picFile.getSize()> SsmModelConstant.FILE_SIZE){
            log.info("【上传文件】 上传文件过大！ picFile={} ",picFile);
            throw new SsmModelException(ErrorMsgEnums.UPLOAD_SIZE_ERROR);
        }
//        5.2 类型判断.
        String fileName = picFile.getOriginalFilename();
        String picFileType = fileName.substring(fileName.lastIndexOf(".")+1);
        if (!SsmModelConstant.FILE_TYPE.contains(picFileType)){
            log.info("【上传文件】 上传文件格式错误！ picFile={} fileName={}",picFile,picFile.getName());
            throw new SsmModelException(ErrorMsgEnums.UPLOAD_TYPE_ERROR);
        }
//        5.3 是否损坏.
        if (ImageIO.read(picFile.getInputStream())==null){
            log.info("【上传文件】 上传文件已损坏！ picFile={} ",picFile);
            throw new SsmModelException(ErrorMsgEnums.UPLOAD_DAMAGE);
        }
//        5.4 新名字.
        String newPicFile = UUID.randomUUID().toString()+"."+picFileType;
//        5.5 保存到本地.
        String path = request.getServletContext().getRealPath("/") + "static/images/" + newPicFile ;
        //没有images文件夹是自动创建该文件夹
        File file = new File(path);
        if (!file.getParentFile().exists()){
            file.getParentFile().mkdirs();
        }
        picFile.transferTo(file);
//        5.6 将图片的访问路径设置到item对象中.
//        http://10.9.63.239/static/images/uploadPicture.jpg
        String visitPath="http://10.9.63.239/static/images/" + newPicFile;
        item.setPic(visitPath);

        itemService.addItem(item);
        return new ResultVO(0,"成功",null);
    }

    //删除商品信息
    @DeleteMapping("/del/{id}")
    @ResponseBody
    public ResultVO del(@PathVariable Integer id){

        itemService.del(id);

        return new ResultVO(0,"成功",null);

    }

    //修改商品信息
    @GetMapping("/up-ui")
    public String upUI(Integer id,Model model){
        if (id==null){
            log.info("【接收参数】 接收商品id错误！ id={} ",id);
            throw new SsmModelException(ErrorMsgEnums.PACKAGE_PARAMETERS_ERROR.getCode(),"查询商品id不能为空!!");
        }
        Item item = itemService.findById(id);
        model.addAttribute("item",item);
        return "item/item_update";
    }

    @PostMapping("/update")
    @ResponseBody
    public ResultVO update(@Valid Item item,BindingResult bindingResult,
                           MultipartFile picFile,
                           HttpServletRequest request) throws IOException {
        if (bindingResult.hasErrors()){
            String msg = bindingResult.getFieldError().getDefaultMessage();
            log.info("【接收参数】 修改商品信息参数不匹配！ item={} msg={}",item,msg);
            throw new SsmModelException(ErrorMsgEnums.PACKAGE_PARAMETERS_ERROR.getCode(),msg);
        }

        //        上传文件
        if (!(picFile==null||picFile.getSize()==0)){
            //        5.1 大小判断.
            if (picFile.getSize()> SsmModelConstant.FILE_SIZE){
                log.info("【上传文件】 上传文件过大！ picFile={} ",picFile);
                throw new SsmModelException(ErrorMsgEnums.UPLOAD_SIZE_ERROR);
            }
//        5.2 类型判断.
            String fileName = picFile.getOriginalFilename();
            String picFileType = fileName.substring(fileName.lastIndexOf(".")+1);
            if (!SsmModelConstant.FILE_TYPE.contains(picFileType)){
                log.info("【上传文件】 上传文件格式错误！ picFile={} fileName={}",picFile,picFile.getName());
                throw new SsmModelException(ErrorMsgEnums.UPLOAD_TYPE_ERROR);
            }
//        5.3 是否损坏.
            if (ImageIO.read(picFile.getInputStream())==null){
                log.info("【上传文件】 上传文件已损坏！ picFile={} ",picFile);
                throw new SsmModelException(ErrorMsgEnums.UPLOAD_DAMAGE);
            }
//        5.4 新名字.
            String newPicFile = UUID.randomUUID().toString()+"."+picFileType;
//        5.5 保存到本地.
            String path = request.getServletContext().getRealPath("/") + "static/images/" + newPicFile ;
            //没有images文件夹是自动创建该文件夹
            File file = new File(path);
            if (!file.getParentFile().exists()){
                file.getParentFile().mkdirs();
            }
            picFile.transferTo(file);
//        5.6 将图片的访问路径设置到item对象中.
//        http://10.9.63.239/static/images/uploadPicture.jpg
            String visitPath="http://10.9.63.239/static/images/" + newPicFile;
            item.setPic(visitPath);

        }
        itemService.update(item);

        return new ResultVO(0,"成功",null);

    }

}
